﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;

namespace iNet.Media
{
	/// <summary>
	/// 實作 IMedia 介面的抽像類別。
	/// </summary>
	public abstract class MediaBase : IMedia
	{
		#region 欄位
		bool _IsDisposed;
		bool _IsReadOnly;
		MediaStorage _MediaStorage;
		IMetadata _Metadata;
		#endregion
		#region 建構子
		/// <summary>
		/// 初始化新的 MediaBase 執行個體。
		/// </summary>
		protected MediaBase()
		{ }
		/// <summary>
		/// 初始化新的 MediaBase 執行個體。
		/// </summary>
		/// <param name="mediaStorage">原始媒體儲存來源。</param>
		/// <param name="isReadOnly">是否為唯讀。</param>
		/// <param name="metadata">中繼資料。</param>
		protected MediaBase(MediaStorage mediaStorage, bool isReadOnly, IMetadata metadata)
		{
			_MediaStorage = mediaStorage;
			_IsReadOnly = isReadOnly;
			if (isReadOnly && metadata != null)
				_Metadata = metadata.GetAsReadOnly();
			else
				_Metadata = metadata;
		}
		#endregion
		#region 解構子
		~MediaBase()
		{
			this.Dispose(false);
		}
		#endregion
		#region Clone
		/// <summary>
		/// 建立可修改的媒體複本。
		/// </summary>
		/// <returns>媒體的複本。</returns>
		public abstract MediaBase Clone();
		#endregion
		#region Dispose
		/// <summary>
		/// 釋放媒體所使用的資源。
		/// </summary>
		public void Dispose()
		{
			this.Dispose(true);
		}
		/// <summary>
		/// 釋放媒體所使用的資源。
		/// </summary>
		/// <param name="disposing">True 表示需釋放 Managed 及 Unmanaged 資源，False 表示僅需釋放 Unmanaged 資源。</param>
		protected virtual void Dispose(bool disposing)
		{
			if (disposing)
			{
				_Metadata = null;
				GC.SuppressFinalize(this);
			}
		}
		#endregion
		#region GetAsReadOnly
		/// <summary>
		/// 取得唯讀版本的媒體。
		/// </summary>
		/// <returns>唯讀版本的媒體。</returns>
		public abstract IMedia GetAsReadOnly();
		#endregion
		#region ICloneable.Clone
		object ICloneable.Clone()
		{
			return this.Clone();
		}
		#endregion
		#region IsDisposed
		/// <summary>
		/// 取得媒體是否已經處置。
		/// </summary>
		public bool IsDisposed
		{
			get 
			{
				return _IsDisposed;
			}
		}
		#endregion
		#region IsReadOnly
		/// <summary>
		/// 取得此媒體是否為唯讀。
		/// </summary>
		public virtual bool IsReadOnly
		{
			get
			{
				return _IsReadOnly;
			}
		}
		#endregion
		#region MediaStorage
		/// <summary>
		/// 取得原始媒體儲存來源。
		/// </summary>
		public virtual MediaStorage MediaStorage
		{
			get
			{
				return _MediaStorage;
			}
		}
		#endregion
		#region Metadata
		/// <summary>
		/// 取得或設定媒體的中繼資料。
		/// </summary>
		public virtual IMetadata Metadata
		{
			get
			{
				return _Metadata;
			}
			set
			{
				if (_IsReadOnly)
					throw new InvalidOperationException();
				_Metadata = value;
			}
		}
		#endregion
	}
}
